home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / compatMapCode.c < prev    next >
C/C++ Source or Header  |  1992-03-27  |  7KB  |  255 lines

  1. /*
  2.  * compatMapCode.c --
  3.  *
  4.  *     Returns the Unix error code corresponding to a Sprite ReturnStatus.
  5.  *
  6.  * Copyright 1986, 1989 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/compatMapCode.c,v 1.12 92/03/27 12:27:06 shirriff Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20. #ifdef KERNEL
  21. #include "sprite.h"
  22. #include "status.h"
  23. #include "compatInt.h"
  24. #include "stdlib.h"
  25. #include "stdio.h"
  26. #include "errno.h"
  27. #include "mem.h"
  28. #else
  29. #include <sprite.h>
  30. #include <status.h>
  31. #include <compatInt.h>
  32. #include <stdio.h>
  33. #include <errno.h>
  34. #endif
  35.  
  36. #ifdef KERNEL
  37. #define fprintf(fp, fmt, status) printf(fmt, status)
  38. #endif
  39.  
  40. typedef struct {
  41.     char *name;        /* ignored, but there for reference */
  42.     int  *array;    /* array of integers, one per ReturnStatus */
  43.     int   size;        /* size of array */
  44. } StatusMappings;
  45.  
  46. /*
  47.  * The tables below map the Sprite ReturnStatus values for each class
  48.  * (gen, proc, etc.) to UNIX errno's.  These tables used to be
  49.  * automatically generated but as part of the transition to the new C
  50.  * library (in 1988), the auto-generator was dropped, leaving this final
  51.  * version.  Eventually, Sprite error codes should go away entirely, leaving
  52.  * only errno's.
  53.  */
  54.  
  55. /*    /sprite/src/lib/libc/Status/gen.stat    */
  56. static int genStatusMappings[] = {
  57. 0, 0, 4, 13, 0, 22, 60, 1, 2, 4, 7, 11, 13, 14, 17, 22, 27, 28, 34, 77, };
  58.  
  59. /*    /sprite/src/lib/libc/Status/proc.stat    */
  60. static int procStatusMappings[] = {
  61. 22, 8, 0, 0, 35, 3, 1, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, };
  62.  
  63. /*    /sprite/src/lib/libc/Status/sys.stat    */
  64. static int sysStatusMappings[] = {
  65. 22, 22, 0, };
  66.  
  67. /*    /sprite/src/lib/libc/Status/rpc.stat    */
  68. static int rpcStatusMappings[] = {
  69. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
  70.  
  71. /*    /sprite/src/lib/libc/Status/fs.stat    */
  72. static int fsStatusMappings[] = {
  73. 13, 22, 22, 22, 22, 9, 0, 32, 28, 0, 0, 0, 2, 35, 40, 21, 20, 1, 70, 17, 66, 62, 18, 73, 22, 22, 13, 0, 26, 29, 19, 70, 70, };
  74.  
  75. /*    /sprite/src/lib/libc/Status/vm.stat    */
  76. static int vmStatusMappings[] = {
  77. 0, 0, 0, 0, 0, 12, };
  78.  
  79. /*    /sprite/src/lib/libc/Status/sig.stat    */
  80. static int sigStatusMappings[] = {
  81. 22, 22, };
  82.  
  83. /*    /sprite/src/lib/libc/Status/dev.stat    */
  84. static int devStatusMappings[] = {
  85. 5, 6, 60, 5, 5, 5, 19, 22, 5, 5, 19, 5, 5, 5, 16};
  86.  
  87. /*    /sprite/src/lib/libc/Status/net.stat    */
  88. static int netStatusMappings[] = {
  89. 51, 65, 61, 54, 0, 56, 57, 48, 49, 0, 45, 42, };
  90.  
  91. static StatusMappings statusMappings[] = {
  92.     {"Gen",      genStatusMappings   ,      20},
  93.     {"Proc",      procStatusMappings  ,      17},
  94.     {"Sys",      sysStatusMappings   ,      3},
  95.     {"Rpc",      rpcStatusMappings   ,      11},
  96.     {"Fs",      fsStatusMappings    ,      33},
  97.     {"Vm",      vmStatusMappings    ,      6},
  98.     {"Sig",      sigStatusMappings   ,      2},
  99.     {"Dev",      devStatusMappings   ,      15},
  100.     {"Net",      netStatusMappings   ,      12},
  101. };
  102. static int maxNumModules = 9;
  103.  
  104.  
  105. /*
  106.  *----------------------------------------------------------------------
  107.  *
  108.  * Compat_MapCode --
  109.  *
  110.  *    Given a Sprite ReturnStatus, return the corresponding UNIX
  111.  *    errno value.
  112.  *
  113.  * Results:
  114.  *    The errno value corresponding to status is returned.  If the
  115.  *    mapping didn't work, an error message will be output and
  116.  *    EINVAL will be returned as a default.
  117.  *
  118.  * Side effects:
  119.  *    None.
  120.  *
  121.  *----------------------------------------------------------------------
  122.  */
  123.  
  124. int
  125. Compat_MapCode(status)
  126.     ReturnStatus  status;
  127. {
  128.     int module = STAT_MODULE(status);
  129.     int msg    = STAT_MSGNUM(status);
  130.     int code   = 0;
  131.  
  132.     if (status < 0) {
  133.         fprintf(stderr,
  134.         "*** compat: Cannot decode user status value 0x%x\n", status);
  135.     } else if (module >= maxNumModules) {
  136.         fprintf(stderr,
  137.         "*** compat: Invalid module # in status value 0x%x\n", status);
  138.     } else if (msg >= statusMappings[module].size) {
  139. #ifdef KERNEL
  140.         printf(
  141.         "*** compat: Invalid message # for %s module: status = 0x%x\n", 
  142.         statusMappings[module].name, status);
  143. #else
  144.         fprintf(stderr,
  145.         "*** compat: Invalid message # for %s module: status = 0x%x\n", 
  146.         statusMappings[module].name, status);
  147. #endif
  148.     } else {
  149.         code = statusMappings[module].array[msg];
  150.     }
  151.  
  152.     /*
  153.      * No mapping was found. At least return some type of error value.
  154.      */
  155.     if (code == 0 &&  status != GEN_SUCCESS) {
  156.         code = 22;  /* EINVAL */
  157.     }
  158.     return(code);
  159. }
  160.  
  161. /*
  162.  *----------------------------------------------------------------------
  163.  *
  164.  * Compat_MapToSprite --
  165.  *
  166.  *    Given a UNIX errno value, return the corresponding Sprite
  167.  *    ReturnStatus.
  168.  *
  169.  * Results:
  170.  *    The result is the Sprite ReturnStatus corresponding to
  171.  *    unixErrno.  This mapping isn't exact, in that there may
  172.  *    be several Sprite values that map to the same UNIX value,
  173.  *    but this procedure will always return a value that will
  174.  *    map back to unixErrno when passed to Compat_MapCode.
  175.  *
  176.  * Side effects:
  177.  *    None.
  178.  *
  179.  *----------------------------------------------------------------------
  180.  */
  181.  
  182. ReturnStatus
  183. Compat_MapToSprite(unixErrno)
  184.     int unixErrno;        /* A UNIX error number (e.g. EINVAL). */
  185. {
  186. #define NO_STATUS ((ReturnStatus) -1)
  187.     static int first, last;
  188.     static ReturnStatus *table;
  189.     static int initialized = 0;
  190.     int i, j, k;
  191.     ReturnStatus result;
  192.  
  193.     /*
  194.      * On the first call to this procedure, build a reverse mapping
  195.      * table from the information in statusMappings.  Do it in three
  196.      * steps:  1) scan statusMappings to find out the range of errnos
  197.      * we have to handle;  2) create and initialize the table;  3)
  198.      * scan statusMappings again to generate reverse mappings.
  199.      */
  200.  
  201.     if (!initialized) {
  202.     initialized = 1;
  203.     first = 100000;
  204.     last = -100000;
  205.     for (i = 0; i < maxNumModules; i++) {
  206.         for (j = 0; j < statusMappings[i].size; j++) {
  207.         k = statusMappings[i].array[j];
  208.         if (k < first) {
  209.             first = k;
  210.         }
  211.         if (k > last) {
  212.             last = k;
  213.         }
  214.         }
  215.     }
  216.  
  217.     table = (ReturnStatus *) malloc((unsigned)
  218.         ((last + 1 - first) * sizeof(int)));
  219.     for (i = 0; i <= last-first; i++) {
  220.         table[i] = NO_STATUS;
  221.     }
  222.  
  223.     for (i = 0; i < maxNumModules; i++) {
  224.         for (j = 0; j < statusMappings[i].size; j++) {
  225.         k = statusMappings[i].array[j] - first;
  226.         if (table[k] == NO_STATUS) {
  227.             table[k] = (i << 16) + j;
  228.         }
  229.         }
  230.     }
  231.  
  232.     /*
  233.      * Some UNIX errno's map to multiple Sprite ReturnStatus'es;  in
  234.      * some cases, the wrong Sprite status was chosen above.  Touch
  235.      * up these special cases.
  236.      */
  237.  
  238.     table[EWOULDBLOCK-first] = FS_WOULD_BLOCK;
  239.     }
  240.  
  241.     /*
  242.      * The table is set up.  Do the mapping.
  243.      */
  244.  
  245.     result = NO_STATUS;
  246.     if ((unixErrno >= first) && (unixErrno <= last)) {
  247.     result = table[unixErrno-first];
  248.     }
  249.     if (result == NO_STATUS) {
  250.     fprintf(stderr, "*** compat: unknown errno value %d\n", unixErrno);
  251.     return GEN_FAILURE;
  252.     }
  253.     return result;
  254. }
  255.